#pragma GCC optimize(2, "Ofast", "inline")
#include <iostream>
#include <vector>
#include <map>
#include <cmath>
#include <set>
#include <queue>
#include <stack>
#include <list>
#include <unordered_map>
#include <algorithm>
#define endl '\n'
#define int long long
#define pii pair<int, int>
#define fi first
#define se second
#define int128 __int128_t
using namespace std;

// 已知
int n, m, a, b, w;
vector<vector<pii>> g; // 邻接表表示图，每个元素是 (目标顶点, 权重)
// 未知
int ans = 1 << 30; // 初始化为无穷大
bool vis[1025][1025] = { 0 }; // 记录是否点i异或数值是w是否访问过

void input()
{
    cin >> n >> m;
    g.resize(n + 1); // 顶点编号从1开始
    for (int i = 0; i < m; ++i)
    {
        cin >> a >> b >> w;
        g[a].push_back({ b, w }); // 添加有向边
    }
}

void dfs(int id, int w)
{
    if (id == n)  ans = min(ans, w); // 到达终点，更新答案    
    for (auto [nid, nw] : g[id])
    {
        nw ^= w;
        if (!vis[nid][nw]) // 只要这个邻居的这个异或数值没访问过
        {
            vis[nid][nw] = 1; // 标记为访问过
            dfs(nid, nw); // 搜他的邻居
        }
    }
}

signed main()
{
    cin.tie(0)->sync_with_stdio(false);
    input();
    dfs(1, 0);
    if (ans == 1 << 30) ans = -1;
    cout << ans;

    return 0;
}